共计 708 个字符,预计需要花费 2 分钟才能阅读完成。
什么是单例
单例设计模式是一种常用的设计模式,用于确保系统中的某个对象只存在一个实例,并提供一个全局访问点来访问这个实例。
那么我们要如何来保证全局只有一个实例呢?
首先我们需要防止外部 new 这个对象,然后在提供一个外部可以获取到这个对象的方法,并且在这个方法中我们需要保证外部多次调用获取到的是同一个对象。
如何防止外部实例化
在 go 语言中,我们可以通过首字母的大小写来控制结构体和方法是否能够被外部调用。
如何实现单例
在 go 语言中,我们大概可以使用两种方式来实现单例。一种是饿汉式,一种是懒汉式。
饿汉式
包加载的时候立即创建这个实例。
type singleton struct {
}
var instance *singleton = &singleton{}
func GetInstance() *singleton {return instance}
懒汉式
type singleton struct {
}
var instance *singleton
func GetInstance() *singleton {
if instance == nil {instance = &singleton{}
}
return instance
}
与饿汉式相比,懒汉式将创建这个实例的时机延迟到了实际调用的时候。不过这又会带来并发问题。
这个时候我们可以使用 sync.Once 来确保实例只被创建一次。
支持并发的懒汉式
type singleton struct {
}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {once.Do(func() {instance = &singleton{}
})
return instance
}
正文完
发表至: 设计模式
2023-04-01